<!-- DISABLE-FRONTMATTER-SECTIONS -->

# 章末小测验 [[章末小测验]]

让我们测试一下你在本章学到的东西！

### 1. 应该按照什么顺序读取 Python 回溯？
<Question
	choices={[
		{
			text: "从上到下",
			explain: "错误！大多数编程语言在顶部输出异常，但 Python 在这方面是特殊的。"
		},
		{
			text: "自下而上",
			explain: "正确！Python 在底部显示异常回溯的一个优点是，方便在终端调试。",
			correct: true
		}
	]}
/>

### 2. 什么是最小可复现示例？
<Question
	choices={[
		{
			text: "来自一个简单的 Transformer 体系结构的实现的研究文章",
			explain: "虽然从头开始实现你自己的 Transformer 模型是非常有教育意义的，但这不是我们在这里讨论的内容。"
		},
		{
			text: "一种紧凑且包含所有所需资源的代码块，可以在不依赖于私有文件或数据的情况下运行",
			explain: "正确的！ 最少的可复现示例可以帮助库的维护人员重现你遇到的问题，以便他们可以更快地找到解决方案。",
			correct: true
		},
		{
			text: "Python traceback 的屏幕截图",
			explain: "再试一次 —— 尽管在提交问题时, 附带你所面临错误的屏幕截图很容易, 但只有屏幕截图会使其他人很难重现错误。"
		},
		{
			text: "一个记录整个分析的 Notebook，包括与错误无关的部分",
			explain: "不完全正确 —— 尽管共享一个显示错误的 Google Colab Notebook 会很有帮助, 但要确保它简短， 并且只包含相关代码。 "
		}
	]}
/>

### 3. 假设你尝试运行以下代码，它抛出一个错误：
```py
from transformers import GPT3ForSequenceClassification

# ImportError: cannot import name 'GPT3ForSequenceClassification' from 'transformers' (/Users/lewtun/miniconda3/envs/huggingface/lib/python3.8/site-packages/transformers/__init__.py)
# ---------------------------------------------------------------------------
# ImportError                               Traceback (most recent call last)
# /var/folders/28/k4cy5q7s2hs92xq7_h89_vgm0000gn/T/ipykernel_30848/333858878.py in <module>
# ----> 1 from transformers import GPT3ForSequenceClassification

# ImportError: cannot import name 'GPT3ForSequenceClassification' from 'transformers' (/Users/lewtun/miniconda3/envs/huggingface/lib/python3.8/site-packages/transformers/__init__.py)
```

以下哪项可能是有助于寻求帮助的论坛帖子的标题呢？

<Question
	choices={[
		{
			text: "import错误:无法从'transformers'import 名称'GPT3GPT3ForSequenceClassification'(/Users/lewtun/miniconda3/envs/huggingface/lib/python3.8/site-packages/transformers/_ init _. py) ",
			explain: "包括 traceback 的最后一行可能会更具描述性，但最好把这个放在正文。请再试一次！"
		},
		{
			text: "从 transformers import gpt3forsequeclassification 时出现问题",
			explain: "再试一次——尽管这提供了有用的信息，但最好还是放在正文主体部分。",
		},
		{
			text: "为什么我不能导入 GPT3ForSequenceClassification ?",
			explain: "不错的选择！这个标题是简洁的，并给读者一个线索，什么可能是错误的(即🤗 Transformers 不支持 GPT-3)。",
			correct: true
		},
		{
			text: "🤗 Transformers 支持 GPT-3吗?",
			explain: "好主意! 用问题作为主题标题是向社区传达问题的好方法。",
			correct: true
		}
	]}
/>

### 4. 假设你试图运行 `trainer.train ()`，但是遇到了一个错误，这个错误不能准确地告诉你错误来自哪里。下列哪一项是你应该首先在你的训练管道中寻找错误的地方？
<Question
	choices={[
		{
			text: "计算梯度并执行反向传播的优化步骤",
			explain: "尽管优化器中可能存在缺陷， 但这通常是训练管道中的后几个步骤， 因此首先要检查前面的其他事项。再试一次!"
		},
		{
			text: "计算指标的评估步骤",
			explain: "评估通常是在整个训练结束后进行的， 因此你应该首先检查训练管道的某个地方。",
		},
		{
			text: "数据集",
			explain: "正确的!查看数据几乎你应该做的第一件事，应该在这里确保文本进行了适当的编码， 具有预期的特性， 等等。",
			correct: true
		},
		{
			text: "Dataloader",
			explain: "再试一次—— 这非常接近你应该检查的第一件事。你还记得我们交给 dataloader 的是什么东西吗？"
		}
	]}
/>

### 5. 调试 CUDA 错误的最好方法是什么？
<Question
	choices={[
		{
			text: "在论坛或 GitHub 上发布错误消息。",
			explain: "这不会有什么帮助, 因为 CUDA 的错误信息通常没有有效的信息。"
		},
		{
			text: "在 CPU 上执行相同的代码。",
			explain: "没错, 这应该会给你一个更好的错误消息!",
			correct: true
		},
		{
			text: "请阅读 traceback 以找出错误的原因。",
			explain: "对于任何其他错误, 你都应该这样做, 但 CUDA 错误通常不会在发生的地方引发, 因为大多数 CUDA 操作都是异步的。"
		},
		{
			text: "减少 batch size。",
			explain: "减少 batch size 通常是处理 CUDA 内存不足错误的一个好策略, 但是有哪些通用的好的策略。再试一次！"
		},
		{
			text: "重新启动 Jupyter 内核。",
			explain: "再试一次——重新启动内核不会让错误神奇地消失！",
		}
	]}
/>

### 6. 修复 GitHub 上的问题最好的方法是什么？
<Question
	choices={[
		{
			text: "发布这个 bug 的完整可重复的例子。",
			explain: "是的，这是帮助维护人员找到 bug 的最好方法。你还应该做什么？",
			correct: true
		},
		{
			text: "每天要求更新。",
			explain: "这不太可能给你任何帮助；其他人更可能会忽视你的需求。",
		},
		{
			text: "检查错误周围的源代码，并试图找出错误发生的原因。在 issue 上发布结果。",
			explain: "这肯定会对维护人员有帮助！如果你确实找到了 bug 的来源和修复程序, 甚至可以打开一个 pull 请求。你还应该做些什么？",
			correct: true
		}
	]}
/>

### 7. 为什么对一个 batch 进行过拟合通常是一种好的调试技术？
<Question
	choices={[
		{
			text: "不是这样的， 过拟合总是不好的， 应该避免。",
			explain: "当对整个数据集进行训练时， 过拟合确实可能是一个不好的信号， 表明你的模型不能很好地推广到新的示例。但是， 对于调试， 我们通常不会直接对整个数据集进行训练。再试一次！"
		},
		{
			text: "这使我们能够验证该模型能够将损耗降低到零。",
			explain: "正确! 只需要两个样本的很小的 batch，我们就可以快速验证模型是否具有学习能力。",
			correct: true
		},
		{
			text: "过拟合可以检测我们验证我们输入和标签的张量形状是正确的。",
			explain: "再试一次 —— 如果你的张量形状不对齐， 那么你肯定不能训练， 即使是在一个 batch 里。",
		}
	]}
/>

### 8. 为什么在 🤗 Transformers 存储库中创建新问题时，使用 transformers-cli env 包含有关计算环境的详细信息是个好主意？
<Question
	choices={[
		{
			text: "它可以使维护人员理解你正在使用的库的哪个版本。",
			explain: "正确! 由于库的每个主要版本在API中都可能有更改， 因此了解你正在使用的特定版本有助于缩小问题范围。其他好处是什么?",
			correct: true
		},
		{
			text: "它让维护人员知道你是在 Windows、 macOS 还是 Linux 上运行代码。",
			explain: "正确！错误有时可能是由你正在使用的特定操作系统引起的， 了解这一点有助于维护人员在本地复现这些错误。但这并不是唯一的原因。",
			correct: true
		},
		{
			text: "它可以使维护人员知道你是在 GPU 还是 CPU 上运行代码。",
			explain: "正确的！ 正如我们在本章中所见，在 GPU 或 CPU 上运行的代码可能会产生不同的结果或错误，了解你使用的是哪种硬件。 但这不是唯一的好处...",
			correct: true
		}
	]}
/>